package middleware

import (
	"github.com/gin-gonic/gin"
	"go-shop-api/pkg/e"
	"go-shop-api/pkg/zydhjwt"
	"net/http"
	"strings"
)

// JWTAuthMiddleware 基于JWT的认证中间件
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// Authorization: Bearer **********************************
		// Bearer空格后边为登录接口返回的Token
		// 这里的具体实现方式要依据你的实际业务情况决定
		//authHeader := c.Request.Header.Get("Authorization")
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			c.JSON(http.StatusOK, gin.H{
				"status": e.ErrorTokenIsNil,
				"msg":    "请求头中auth为空",
				"error":  e.TipsErrorTokenIsNil, //显示给自己看，一些程序错误，挑错
				"tips":   e.TipsErrorTokenIsNil, //显示给前端/用户看
				"data":   nil,
			})
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			c.JSON(http.StatusOK, gin.H{
				"status": e.ErrorTokenFormat,
				"msg":    "请求头中auth格式有误",
				"error":  e.TipsErrorTokenFormat, //显示给自己看，一些程序错误，挑错
				"tips":   e.TipsErrorTokenFormat, //显示给前端/用户看
				"data":   nil,
			})

			c.Abort()
			return
		}
		// parts[1]是获取到的tokenString，我们使用之前定义好的解析JWT的函数来解析它
		mc, err := zydhjwt.ParseToken(parts[1])
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status": e.ErrorInvalidToken,
				"msg":    "无效的Token",
				"error":  err.Error(),             //显示给自己看，一些程序错误，挑错
				"tips":   e.TipsErrorInvalidToken, //显示给前端/用户看
				"data":   nil,
			})

			c.Abort()
			return
		}

		// 将当前请求的Uid信息保存到请求的上下文c上
		c.Set("uid", mc.ID)
		c.Next() // 后续的处理函数可以用过c.Get("uid")来获取当前请求的用户信息
	}
}
